In this tutorial, you’ll learn how to filter results around a polygonal location. This location can either be set manually or taken from the current user position.

Dataset

The dataset contains 3000+ of the biggest airports in the world.

json
[
  {
    "objectID": "3797",
    "name": "John F Kennedy Intl",
    "city": "New York",
    "country": "United States",
    "iata_code": "JFK",
    "_geoloc": {
      "lat": 40.639751,
      "lng": -73.778925
    },
    "links_count": 911
  }
]

To tell Algolia where each record is located, we need to have the latitude and longitude stored in the _geoloc attribute.

You can download the dataset here. Have look at how to import it in Algolia here

Initialize the client

SearchClient client = new SearchClient("YourApplicationID", "YourWriteAPIKey");
SearchIndex index = client.InitIndex("your_index_name");

Configure Index Settings

Even if we want to sort by distance to a location, we need the textual relevance to be good in case we refine the search with a query.

For that let’s configure the index.

IndexSettings settings = new IndexSettings
{
    SearchableAttributes = new List<string> { "name", "city", "country", "iata_code", },
    CustomRanking = new List<string> { "desc(links_count)" }
};

index.SetSettings(settings);

Searchable attributes

We’re going to search in our 4 textual attributes: name, city, country and iata_code.

Custom Ranking

We will use the number of other connected airports to any airport as a ranking metric - the more connection the better.

Filtering inside a polygonal area

Let’s filter inside the United State of America.

USA can be considered as a polygon:

To filter inside this polygon we need the latitude and longitude of all the points:

  • 42.01,-124.31,
  • 48.835509470063045,-124.40453125000005
  • 45.01082951668149,-65.95726562500005
  • 31.247243545293433,-81.06578125000004
  • 25.924152577235226,-97.68234374999997
  • 32.300311895879545,-117.54828125

We are going to use the insidePolygon parameter:

index.Search<T>(
    new Query("query")
    {
        InsidePolygon = new List<List<float>>
        {
            new List<float>
            {
                42.01f,
                -124.31f,
                48.835509470063045f,
                -124.40453125000005f,
                45.01082951668149f,
                -65.95726562500005f,
                31.247243545293433f,
                -81.06578125000004f,
                25.924152577235226f,
                -97.68234374999997f,
                32.300311895879545f,
                -117.54828125f,
            }
        }
    }
);

We are using the empty query ('') because we want all airports.